2006年05月28日
川俣晶の縁側ソフトウェアその他開発日誌 total 4626 count

NT版UNIX-like toolsのtail, wcが行末で終わらないファイルの最後の行をカウントしない問題

Written By: 川俣 晶連絡先

 NT版UNIX-like toolsのtail, wcは、最後の行が改行で終わっていない場合、最後の行を1行としてカウントしません。

 この動作は、UNIXの同名のコマンドの動作に合わせたもので、仕様です。

 従って、この動作を変更することはありません。

回避方法 (2006年5月29日差し替え、OOTANI TAKASHIさんに感謝) §

 (Windows付属の)moreを使うと全ての行に改行を付けることができます。

 wcは単純にmoreを前段に付けるだけで回避できます。

 たとえば、以下のようなコマンドを使うと、ファイルbad.txtの全ての行に改行が強制的に付加され、最後の行も1行としてカウントされます。

more <bad.txt|wc

 何らかのコマンドの入力を受け取るなら以下のように使います。

コマンド|more|wc

 ちなみに、moreはファイルやパイプを出力対象としたとき、入力待ちになることはありません。

 tailは残念ながらこの方法では回避できません。たとえば、以下のような方法で一時ファイルに書き出し、それを対象に処理する方が良さそうです。(tailは後ろからテキストを調べる関係上、ランダムアクセスできる対象=つまりファイルを相手に実行する方が良い)

more <bad.txt >tempfile.$$$

tail tempfile.$$$

del tempfile.$$$

説明 §

 このことは、原作者の作成したtailのドキュメントに以下のように記載されています。

最後が改行で終わっていないファイルに対し「tail -行数 ファイル名」

を実行すると、最後の行が行数に数えられないため、出力が指定より1行

多くなる。これは、UNIXのtailに合わせてわざとそうしてある。

 wcに関しては、ドキュメントに明示されていませんが、FreeBSDのwcが同様に最後の行をカウントしないことを確認しました。

 ちなみにFreeBSDを使ったのは、基本コマンドについて、より強力な別ツールへの置き換えがあまり行われていないだろう……という(あまり根拠のない)判断によるものです。